﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using JasRibbonApplicatie.Classes;

namespace JasRibbonApplicatie.Model
{
    public class GebruikerModel:Model
    {
        public GebruikerModel()
        {
            Console.WriteLine("GebruikerModel Created");
        }
        public enum Functie
        {
            Voorzitter,
            Secretaris,
            Penningmeester,
            Lid
        }

        public Gebruiker GetGebruikerById(int id)
        {
            var gebruikers = from g in entities.Gebruiker
                             where g.gebruiker_id.Equals(id)
                             select g;
            if (gebruikers.Count() > 0)
            {
                return gebruikers.First();
            }
            else
            {
                return null;
            }
        }

        public List<Gebruiker> GetAllGebruikers(string containing = "")
        {
            if (containing == "")
            {
                return (from gebruikers in entities.Gebruiker
                        select gebruikers).ToList();
            }
            else
            {
                return (from gebruikers in entities.Gebruiker
                        where (gebruikers.naam + " " + gebruikers.voornaam).Contains(containing)
                        select gebruikers).ToList();
            }
        }
        // Summary:
        //      Takes all the magazijniers and beheerders from the database
        //
        // Returns:
        //      A list of users or empty list
        //
        public List<Gebruiker> GetAllLoginData()
        {
            List<Gebruiker> personen = new List<Gebruiker>();
            var magazijniersQuery = (from m in entities.Magazijnier
                                     where (m.einde == null || m.einde > DateTime.Now)
                                     select m.gebruiker).ToList();

            personen.AddRange(magazijniersQuery);
            var beheerdersQuery = (from beheerpersonen in entities.Gebruiker
                                   where beheerpersonen.rechten_id.Equals(2)
                                   select beheerpersonen).ToList();
            personen.AddRange(beheerdersQuery);
            return personen;
        }

        public List<LidAlgVerg> GetAllLedenalgverg()
        {
            return (from ledenalgverg in entities.LidAlgVerg
                    select ledenalgverg).ToList();
        }

        public Magazijnier GetMagazijnierByMagazijnierId(int? id)
        {
            if (id != null)
            {
                var magazijnierQuery = from mag in entities.Magazijnier
                                       where mag.magazijnier_id.Equals(id.Value)
                                       select mag;
                if (magazijnierQuery.Count() > 0)
                    return magazijnierQuery.First();
            }
            return null;
        }

        public List<Magazijnier> GetAllMagazijniers()
        {
            return (from mag in entities.Magazijnier select mag).ToList();
        }

        // GetMagazijnierForDate wordt momenteel niet gebruikt???
        public Magazijnier GetMagazijnierForDate(DateTime? datum)
        {
            if (datum != null)
            {
                var magazijniers = from planning in entities.PlanningMagazijnier
                                   where planning.datum.Year.Equals(datum.Value.Year)
                                   && planning.datum.Month.Equals(datum.Value.Month)
                                   && planning.datum.Day.Equals(datum.Value.Day)
                                   select planning.magazijnier;
                if (magazijniers.Count() > 0)
                    return magazijniers.First();
            }
            return null;
        }

        public List<PlanningMagazijnier> GetPlanningenForDate(DateTime? datum)
        {
            List<PlanningMagazijnier> planningen = new List<PlanningMagazijnier>();
            if (datum != null)
                planningen = (from p in entities.PlanningMagazijnier
                              where p.datum.Year.Equals(datum.Value.Year)
                              && p.datum.Month.Equals(datum.Value.Month)
                              && p.datum.Day.Equals(datum.Value.Day)
                              select p).ToList();
            return planningen;
        }

        public List<PlanningMagazijnier> GetPlanningMagazijnierByMagazijnierIdAndDate(int magazijnierId, DateTime datum)
        {
            return (from p in entities.PlanningMagazijnier
                    where p.magazijnier_id == magazijnierId && p.datum == datum
                    select p).ToList();
        }

        public List<PlanningMagazijnier> GetPlanningMagazijniers(DateTime date)
        {
            return (from plan in entities.PlanningMagazijnier
                    where plan.datum.Year == date.Year &&
                          plan.datum.Month == date.Month &&
                          plan.datum.Day == date.Day
                    select plan).ToList();
        }
        public List<PlanningMagazijnier> GetPlanningMagazijniers(DateTime startDate, DateTime endDate)
        {
            return (from plan in entities.PlanningMagazijnier
                    where plan.datum >= startDate && plan.datum < endDate
                    select plan).ToList();
        }
        public List<PlanningMagazijnier> GetPlanningMagazijniers()
        {
            return (from plan in entities.PlanningMagazijnier select plan).ToList();
        }
        public List<PlanningMagazijnier> GetPlanningMagazijniersByGebruikersId(int gebruikerId)
        {
            return (from plan in entities.PlanningMagazijnier
                    where plan.magazijnier.gebruiker_id == gebruikerId
                    select plan).ToList();
        }

        public Postcode GetPostcodeByPostcodeId(int Postcode_id)
        {
            var postcodeQuery = from p in entities.Postcode
                                where p.postc_id.Equals(Postcode_id)
                                select p;
            return postcodeQuery.First<Postcode>();
        }

        public Recht GetRechtenById(int Rechten_id)
        {
            var query = from r in entities.Recht
                        where r.rechten_id.Equals(Rechten_id)
                        select r;
            if (query.Count() > 0)
                return query.First();
            return null;
        }
        public void SetRechtenByGebruiker_id(int Gebruiker_id, int Rechten_id)
        {
            var query = from g in entities.Gebruiker
                        where g.gebruiker_id == Gebruiker_id && g.rechten_id != Rechten_id
                        select g;
            if (query.Count() > 0)
            {
                var g = query.First();
                g.rechten_id = Rechten_id;
                //OpslaanWijzigingen(false);
            }
        }
        public List<Recht> GetAllRechten()
        {
            var query = from r in entities.Recht
                        select r;
            return query.ToList();
        }
        public Vereniging GetVerenigingById(int id)
        {
            var verenigingQuery = from vereniging in entities.Vereniging
                                  where vereniging.vereniging_id.Equals(id)
                                  select vereniging;
            if (verenigingQuery.Count() > 0)
                return verenigingQuery.First<Vereniging>();
            return null;
        }

        public void SetRaadVanBestuur(int Gebruiker_id, bool lid)
        {
            SetRaadVanBestuur(Gebruiker_id, lid, Functie.Lid);
        }

        public void SetRaadVanBestuur(int Gebruiker_id, bool lid, Functie functie)
        {
            var query = from l in entities.LidRvbs
                        where l.gebruiker_id.Equals(Gebruiker_id) && (l.einde == new DateTime(1, 1, 1) || l.einde > DateTime.Now)
                        select l;
            if (query.Count() > 0 && !lid)
            {
                query.First().einde = DateTime.Now;
            }
            else if (query.Count() < 1 && lid)
            {
                entities.AddToLidRvbs(new LidRvbs()
                {
                    gebruiker_id = Gebruiker_id,
                    start = DateTime.Now,
                    functie = Enum.GetName(typeof(Functie), functie)
                });
            }
            //OpslaanWijzigingen(false);
        }

        public bool IsRaadVanBestuur(int Gebruiker_id)
        {
            var query = from l in entities.LidRvbs
                        where l.gebruiker_id.Equals(Gebruiker_id) && (l.einde == new DateTime(1, 1, 1) || l.einde > DateTime.Now)
                        select l;
            return (query.Count() > 0);
        }

        public void SetAlgemeneVergadering(int Gebruiker_id, bool lid)
        {
            var query = from l in entities.LidAlgVerg
                        where l.gebruiker_id.Equals(Gebruiker_id) && (l.einde == new DateTime(1, 1, 1) || l.einde > DateTime.Now)
                        select l;
            if (query.Count() > 0 && !lid)
            {
                query.First().einde = DateTime.Now;
            }
            else if (query.Count() < 1 && lid)
            {
                entities.AddToLidAlgVerg(new LidAlgVerg()
                {
                    gebruiker_id = Gebruiker_id,
                    start = DateTime.Now
                });
            }
            //OpslaanWijzigingen(false);
        }

        public bool IsAlgemeneVergadering(int Gebruiker_id)
        {
            var query = from l in entities.LidAlgVerg
                        where l.gebruiker_id.Equals(Gebruiker_id) && (l.einde == new DateTime(1, 1, 1) || l.einde > DateTime.Now)
                        select l;
            return (query.Count() > 0);
        }

        public void SetMagazijnier(int Gebruiker_id, bool lid)
        {
            var query = from l in entities.Magazijnier
                        where l.gebruiker_id.Equals(Gebruiker_id) && (l.einde == new DateTime(1, 1, 1) || l.einde == null || l.einde > DateTime.Now)
                        select l;
            if (query.Count() > 0 && !lid)
            {
                query.First().einde = DateTime.Now;
            }
            else if (query.Count() < 1 && lid)
            {
                entities.AddToMagazijnier(new Magazijnier()
                {
                    gebruiker_id = Gebruiker_id,
                    start = DateTime.Now,
                    streepjescode = StreepjesCode.ConvertToStreepjesCode(StreepjesCode.CodeType.Gebruiker, Gebruiker_id)
                });
            }
            //OpslaanWijzigingen(false);
        }

        public bool IsMagazijnier(int Gebruiker_id)
        {
            var query = from l in entities.Magazijnier
                        where l.gebruiker_id.Equals(Gebruiker_id) && (l.einde == new DateTime(1, 1, 1) || l.einde == null || l.einde > DateTime.Now)
                        select l;
            return (query.Count() > 0);
        }

        public string GetBestuursFunctieById(int Gebruiker_id)
        {
            var bestuursledenfuncties = from b in entities.LidRvbs
                                        where b.gebruiker_id.Equals(Gebruiker_id) && (b.einde == new DateTime(1, 1, 1) || b.einde > DateTime.Now)
                                        select b.functie;
            if (bestuursledenfuncties.Count() > 0)
            {
                return bestuursledenfuncties.First().ToString();
            }
            return "";
        }

        public Dictionary<DateTime, string> GetMagazijnierNaamAndDate(int jaartal)
        {
            var magdays = from planning in entities.PlanningMagazijnier
                          join mag in entities.Magazijnier on planning.magazijnier_id equals mag.magazijnier_id
                          join geb in entities.Gebruiker on mag.gebruiker_id equals geb.gebruiker_id
                          where planning.datum.Year == jaartal
                          select new { planning.datum, geb.voornaam, geb.naam };

            return magdays.ToDictionary(n => n.datum, n => n.naam + ' ' + n.voornaam);
        }

        public bool PlanningBestaat(DateTime datum)
        {
            var aantalBestaandePlanningen = (from p in entities.PlanningMagazijnier
                                             where p.datum == datum
                                             select p).Count();
            return (aantalBestaandePlanningen > 0);
        }

        public void SetBestuurdersFunctieById(int Gebruiker_id, Functie functie)
        {
            var best = (from b in entities.LidRvbs
                        where b.gebruiker_id == Gebruiker_id
                        select b);
            var latest = from b in best
                         where b.start == best.Max(be => be.start)
                         select b;
            if (latest.Count() > 0)
            {
                LidRvbs lid = latest.First();
                if (lid.einde == DateTime.MinValue || lid.einde > DateTime.Now)
                {
                    lid.functie = Enum.GetName(typeof(Functie), functie);
                    //OpslaanWijzigingen(false);
                }
            }
        }

        public bool IsRaadVanBestuur(Gebruiker gebruiker)
        {
            return ((from rvbs in gebruiker.lidRvbs
                     where rvbs.einde == null || rvbs.einde > DateTime.Now
                     select rvbs).Count() > 0);
        }

        public bool IsMagazijnier(Gebruiker gebruiker)
        {
            return ((from mag in gebruiker.lidRvbs
                     where mag.einde == null || mag.einde > DateTime.Now
                     select mag).Count() > 0);
        }

        public List<Email> GetMails(int aanvraagId)
        {
            string str = "[id-" + aanvraagId.ToString() + "-id]";
            var eml = (from e in entities.Email
                       where e.subject.ToLower().Replace(" ", "").Contains(str)
                       select e).ToList();
            return eml;
        }

        public List<EmailAdres> GetMailAddresses(string search)
        {
            var gebruikers = (from g in entities.Gebruiker
                              where (g.naam + " " + g.voornaam).Contains(search) || g.email.Contains(search)
                              select g).ToList();
            List<EmailAdres> emailadressen = new List<EmailAdres>();
            if (gebruikers.Count() > 0)
                foreach (var g in gebruikers) emailadressen.Add(new EmailAdres(g.NaamVoornaam, g.email));
            return emailadressen;
        }

        public void AddToPlanningMagazijnier(PlanningMagazijnier pl)
        {
            entities.AddToPlanningMagazijnier(pl);
        }

        internal void DeletePlanningMagazijnier(PlanningMagazijnier planning)
        {
            entities.DeleteObject(planning);
        }
    }
}
